package com.chainyoung.component_tmmarket.utils;

import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Matrix;
import android.graphics.Paint;

import com.chainyoung.component_tmmarket.bean.Kline;
import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.charts.CandleStickChart;
import com.github.mikephil.charting.charts.CombinedChart;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.data.CandleData;
import com.github.mikephil.charting.data.CandleDataSet;
import com.github.mikephil.charting.data.CandleEntry;
import com.github.mikephil.charting.data.CombinedData;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Author by Damon,  on 2018/8/7.
 */
public class ChartUtils {

    public static final String TYPE_MINUTE = "60";//分时线
    public static final String TYPE_15_MINUTE = "900";//15分
    public static final String TYPE_ONE_HOUR = "3600";//1小时
    public static final String TYPE_FOUR_HOUR = "14400";//4小时
    public static final String TYPE_DAY = "86400";//日线


    public static LineChart initChart(LineChart chart) {
        // 不显示数据描述
        chart.getDescription().setEnabled(false);
        // 没有数据的时候，显示“暂无数据”
        chart.setNoDataText("暂无数据");
        // 不显示表格颜色
        chart.setDrawGridBackground(false);
        // 不可以缩放
        chart.setScaleEnabled(false);
        // 不显示y轴右边的值
        chart.getAxisRight().setEnabled(false);
        // 不显示图例
        Legend legend = chart.getLegend();
        legend.setEnabled(false);
        // 向左偏移15dp，抵消y轴向右偏移的30dp
        chart.setExtraLeftOffset(-15);


        XAxis xAxis = chart.getXAxis();
        // 不显示x轴
        xAxis.setDrawAxisLine(false);
        // 设置x轴数据的位置
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE);
        xAxis.setTextColor(Color.parseColor("#000000"));
        xAxis.setTextSize(12);
        xAxis.setGridColor(Color.parseColor("#7e8ca6"));
        // 设置x轴数据偏移量
        xAxis.setYOffset(-12);
        xAxis.setDrawGridLines(false);

        YAxis yAxis = chart.getAxisLeft();
        yAxis.setGridDashedLine(new DashPathEffect(new float[]{3, 3}, 3));
        // 不显示y轴
        yAxis.setDrawAxisLine(false);
        // 设置y轴数据的位置
        yAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
        yAxis.setGridColor(Color.parseColor("#7e8ca6"));
        // 不从y轴发出横向直线
        yAxis.setDrawGridLines(true);
        yAxis.setTextColor(Color.parseColor("#7e8ca6"));
        yAxis.setTextSize(12);
        // 设置y轴数据偏移量
        yAxis.setXOffset(16);
        yAxis.setYOffset(-3);
        yAxis.setAxisMinimum(0);


        Matrix matrix = new Matrix();
        // x轴缩放1.5倍
        matrix.postScale(4.5f, 1f);
        // 在图表动画显示之前进行缩放
        //chart.getViewPortHandler().refresh(matrix, chart, false);
        // x轴执行动画
        chart.animateX(1000);
        chart.invalidate();
        return chart;
    }


    public static void setChartData(LineChart chart, List<Entry> values) {
        LineDataSet lineDataSet;

        if (chart.getData() != null && chart.getData().getDataSetCount() > 0) {
            lineDataSet = (LineDataSet) chart.getData().getDataSetByIndex(0);
            lineDataSet.setValues(values);
            chart.getAxisLeft().setAxisMinimum(lineDataSet.getYMin());
            chart.getData().notifyDataChanged();
            chart.notifyDataSetChanged();
        } else {
            lineDataSet = new LineDataSet(values, "");
            // 设置曲线颜色
            lineDataSet.setColor(Color.parseColor("#3a5eff"));
            // 设置平滑曲线
            lineDataSet.setMode(LineDataSet.Mode.LINEAR);
            // 不显示坐标点的小圆点
            lineDataSet.setDrawCircles(true);
            lineDataSet.setDrawCircleHole(false);
            lineDataSet.setCircleColor(Color.parseColor("#3a5eff"));

            // 不显示坐标点的数据
            lineDataSet.setDrawValues(false);
            // 不显示定位线
            lineDataSet.setHighlightEnabled(true);
            chart.getAxisLeft().setAxisMinimum(lineDataSet.getYMin());
            LineData data = new LineData(lineDataSet);
            chart.setData(data);
            chart.invalidate();
        }
    }


//    public static void notifyDataSetChanged(LineChart chart, List<Entry> values,
//                                            final List<String> xValues) {
//        chart.getXAxis().setValueFormatter(new IAxisValueFormatter() {
//            @Override
//            public String getFormattedValue(float value, AxisBase axis) {
//                return xValues.get((int) value);
//            }
//        });
//
//        chart.invalidate();
//        setChartData(chart, values);
//    }


    public static void notifyDataSetChanged(LineChart chart, List<Entry> values) {
        chart.getXAxis().setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                String time = dfs.format(new Date((long) (value * 1000)));
                return time.substring(time.length() - 5);
            }
        });

        chart.getAxisLeft().setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                return String.format("%.3f", value);
            }
        });

        //chart.invalidate();
        setChartData(chart, values);
    }


    public static CombinedChart initCandleChart(CombinedChart chart) {
        // 不显示数据描述
        //chart.getDescription().setEnabled(false);
        // 没有数据的时候，显示“暂无数据”
        chart.setNoDataText("暂无数据");
        chart.setDescription(null);
        //chart.setBackgroundColor(Color.DKGRAY);
        // chart.setGridBackgroundColor(Color.WHITE & 0x70FFFFFF);
        //chart.setMaxVisibleValueCount(30);

        // 不显示表格颜色
        chart.setDrawGridBackground(false);
        // 不可以缩放
        chart.setScaleYEnabled(false);
        chart.setScaleXEnabled(true);
        // 不显示y轴右边的值
        chart.getAxisRight().setEnabled(true);
        chart.getAxisLeft().setEnabled(false);
        // 显示图例
        Legend l = chart.getLegend();
        l.setEnabled(true);
        l.setWordWrapEnabled(true);
        l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
        l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
        l.setDrawInside(false);
        l.setTextColor(Color.WHITE);

        XAxis xAxis = chart.getXAxis();
        // 不显示x轴
        xAxis.setDrawAxisLine(false);
        // 设置x轴数据的位置
        // xAxis.setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE);
        xAxis.setEnabled(false);
        xAxis.setTextColor(Color.parseColor("#45566e"));
        xAxis.setTextSize(12);
        xAxis.setGridColor(Color.parseColor("#45566e"));
        // 设置x轴数据偏移量
        // xAxis.setYOffset(-12);
        xAxis.setDrawGridLines(false);
        xAxis.setLabelCount(5, false);


        YAxis yAxis = chart.getAxisRight();
        // 不显示y轴
        yAxis.setDrawAxisLine(false);
        // 设置y轴数据的位置
        yAxis.setPosition(YAxis.YAxisLabelPosition.INSIDE_CHART);
        yAxis.setGridColor(Color.parseColor("#8fffffff"));
        // 不从y轴发出横向直线
        yAxis.setDrawGridLines(false);
        yAxis.setGridColor(Color.parseColor("#8fffffff"));
        yAxis.setTextColor(Color.parseColor("#8fffffff"));
        yAxis.setTextSize(12);
        // 设置y轴数据偏移量
        // yAxis.setXOffset(16);
        yAxis.setYOffset(-3);
        // yAxis.setAxisMinimum(0);


        Matrix matrix = new Matrix();
        // x轴缩放1.5倍
        // matrix.postScale(1.5f, 1f);
        // 在图表动画显示之前进行缩放
        //chart.getViewPortHandler().refresh(matrix, chart, false);
        // x轴执行动画
        //  chart.animateX(1000);
        chart.invalidate();
        return chart;
    }

    public static void setCombinedChart(CombinedChart chart, List<CandleEntry> values, List<Entry> ma5, List<Entry> ma10, List<Entry> ma30) {
        CandleDataSet candleDataSet;
        LineDataSet lineDataSetMa5;
        LineDataSet lineDataSetMa10;
        LineDataSet lineDataSetMa30;
        if (chart.getData() != null && chart.getData().getDataSetCount() > 0) {
            candleDataSet = (CandleDataSet) chart.getData().getCandleData().getDataSetByIndex(0);
            lineDataSetMa5 = (LineDataSet) chart.getData().getLineData().getDataSetByIndex(0);
            lineDataSetMa10 = (LineDataSet) chart.getData().getLineData().getDataSetByIndex(1);
            lineDataSetMa30 = (LineDataSet) chart.getData().getLineData().getDataSetByIndex(2);
            candleDataSet.setValues(values);
            lineDataSetMa5.setValues(ma5);
            lineDataSetMa10.setValues(ma10);
            lineDataSetMa30.setValues(ma30);
            // chart.setVisibleXRange(0, 20);
            //chart.getAxisLeft().setAxisMinimum( candleDataSet.getYMin());

            Matrix matrix = new Matrix();
            // matrix.postScale(values.size() / 40, 1f);
            // chart.getViewPortHandler().refresh(matrix, chart, false);
            chart.getData().notifyDataChanged();
            // chart.setMaxVisibleValueCount(30);
            chart.notifyDataSetChanged();
        } else {
            CombinedData data = new CombinedData();
            data.setData(generateCandleData(values, chart));
            data.setData(generateLineData(ma5, ma10, ma30));
            //  data.setData(generateLine10Data(ma10));
            //data.setData(generateLine30Data(ma30));
            chart.setData(data);
            //chart.setMaxVisibleValueCount(30);
            // chart.setVisibleXRange(0, 20);
            chart.moveViewToX(values.size() - 1);
            Matrix matrix = new Matrix();
            //matrix.postScale(values.size() / 40, 1f);
            //chart.getViewPortHandler().refresh(matrix, chart, true);
            chart.animateX(1000);
            //chart.invalidate();
        }
    }

    public static void notifyCandleDataSetChanged(CombinedChart chart, List<CandleEntry> values, List<Entry> ma5Data, List<Entry> ma10Data, List<Entry> ma30Data, final String type,
                                                  final List<Long> timeList) {

        //chart.invalidate();
//        chart.getXAxis().setValueFormatter(new IAxisValueFormatter() {
//            @Override
//            public String getFormattedValue(float value, AxisBase axis) {
//                SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm");
//                String time = dfs.format(new Date((timeList.get((int) value) * 1000)));
//                switch (type) {
//                    case TYPE_MINUTE:
//                        return time.substring(time.length() - 5);
//                    case TYPE_15_MINUTE:
//                    case TYPE_ONE_HOUR:
//                    case TYPE_FOUR_HOUR:
//                        return time.substring(time.length() - 11);
//                    case TYPE_DAY:
//                        return time.substring(0, 10);
//                }
//                return "";
//
//            }
//        });
        if (values.isEmpty()) {
            return;
        }
        setCombinedChart(chart, values, ma5Data, ma10Data, ma30Data);
    }

    private static CandleData generateCandleData(List<CandleEntry> values, CombinedChart chart) {
        CandleDataSet candleDataSet;
        candleDataSet = new CandleDataSet(values, "");
        // 设置颜色
        candleDataSet.setIncreasingColor(Color.parseColor("#09C173"));
        candleDataSet.setDecreasingColor(Color.parseColor("#F95A54"));
        candleDataSet.setIncreasingPaintStyle(Paint.Style.FILL);
        candleDataSet.setDecreasingPaintStyle(Paint.Style.FILL);
        candleDataSet.setShadowColorSameAsCandle(true);
        candleDataSet.setShadowWidth(1f);
        candleDataSet.setNeutralColor(Color.parseColor("#45566e"));
        candleDataSet.setHighlightLineWidth(0.5f);
        candleDataSet.setHighLightColor(Color.parseColor("#45566e"));
        candleDataSet.setAxisDependency(YAxis.AxisDependency.RIGHT);
        // 不显示坐标点的数据
        candleDataSet.setDrawValues(false);
        candleDataSet.setFormSize(0);
        if (values.size() <= 10) {
            candleDataSet.setBarSpace(0.45f);
        } else if (values.size() > 10 && values.size() < 30) {
            candleDataSet.setBarSpace(0.25f);
        } else {
            Matrix matrix = new Matrix();
            matrix.postScale(values.size() / 30, 1f);
            chart.getViewPortHandler().refresh(matrix, chart, false);
        }
        // 不显示定位线
        candleDataSet.setHighlightEnabled(true);
        //  chart.getAxisLeft().setAxisMinimum( candleDataSet.getYMin());
        return new CandleData(candleDataSet);
    }

    private static LineData generateLineData(List<Entry> ma5, List<Entry> ma10, List<Entry> ma30) {
        LineData lineData = new LineData();
        LineDataSet lineDataSet;
        lineDataSet = new LineDataSet(ma5, "Ma5");
        // 设置曲线颜色
        lineDataSet.setColor(Color.parseColor("#800080"));
        // 设置平滑曲线
        lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);
        lineDataSet.setAxisDependency(YAxis.AxisDependency.RIGHT);
        // 不显示坐标点的小圆点
        lineDataSet.setDrawCircles(false);
        // 不显示坐标点的数据
        lineDataSet.setDrawValues(false);
        // 不显示定位线
        lineDataSet.setHighlightEnabled(false);

        LineDataSet lineDataSet1;
        lineDataSet1 = new LineDataSet(ma10, "Ma10");
        // 设置曲线颜色
        lineDataSet1.setColor(Color.YELLOW);
        // 设置平滑曲线
        lineDataSet1.setMode(LineDataSet.Mode.CUBIC_BEZIER);
        lineDataSet1.setAxisDependency(YAxis.AxisDependency.RIGHT);
        // 不显示坐标点的小圆点
        lineDataSet1.setDrawCircles(false);
        // 不显示坐标点的数据
        lineDataSet1.setDrawValues(false);
        // 不显示定位线
        lineDataSet1.setHighlightEnabled(false);

        LineDataSet lineDataSet2;
        lineDataSet2 = new LineDataSet(ma30, "Ma30");
        // 设置曲线颜色
        lineDataSet2.setColor(Color.RED);
        // 设置平滑曲线
        lineDataSet2.setMode(LineDataSet.Mode.CUBIC_BEZIER);
        lineDataSet2.setAxisDependency(YAxis.AxisDependency.RIGHT);
        // 不显示坐标点的小圆点
        lineDataSet2.setDrawCircles(false);
        // 不显示坐标点的数据
        lineDataSet2.setDrawValues(false);
        // 不显示定位线
        lineDataSet2.setHighlightEnabled(false);

        lineData.addDataSet(lineDataSet);
        lineData.addDataSet(lineDataSet1);
        lineData.addDataSet(lineDataSet2);
        return lineData;
    }


    public static BarChart initBarChart(BarChart chart) {
        // 不显示数据描述
        //chart.getDescription().setEnabled(false);
        // 没有数据的时候，显示“暂无数据”
        chart.setNoDataText("暂无数据");
        // chart.setNoDataTextColor(Color.RED);
        chart.setDescription(null);
        //chart.setBackgroundColor(Color.DKGRAY);
        //hart.setGridBackgroundColor(Color.WHITE & 0x70FFFFFF);

        // 不显示表格颜色
        chart.setDrawGridBackground(false);
        // 不可以缩放
        chart.setScaleXEnabled(true);
        chart.setScaleYEnabled(false);
        chart.setAutoScaleMinMaxEnabled(true);
        // 不显示y轴右边的值
        chart.getAxisRight().setEnabled(true);
        chart.getAxisLeft().setEnabled(false);
        // 不显示图例
        Legend legend = chart.getLegend();
        legend.setEnabled(false);
        // 向左偏移15dp，抵消y轴向右偏移的30dp
        //chart.setExtraLeftOffset(-15);


        XAxis xAxis = chart.getXAxis();
        // 不显示x轴
        xAxis.setDrawAxisLine(false);
        xAxis.setAxisLineColor(Color.GREEN);
        xAxis.setLabelCount(5);
        // 设置x轴数据的位置
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE);
        xAxis.setTextColor(Color.parseColor("#45566e"));
        xAxis.setTextSize(10);
        xAxis.setGridColor(Color.parseColor("#45566e"));
        // 设置x轴数据偏移量
        xAxis.setYOffset(-12);
        xAxis.setDrawGridLines(false);

        YAxis yAxis = chart.getAxisRight();

        // 不显示y轴
        yAxis.setDrawAxisLine(false);
        // 设置y轴数据的位置
        yAxis.setPosition(YAxis.YAxisLabelPosition.INSIDE_CHART);
        yAxis.setGridColor(Color.parseColor("#8fffffff"));
        // 不从y轴发出横向直线
        yAxis.setDrawGridLines(false);
        yAxis.setTextColor(Color.parseColor("#8fffffff"));
        yAxis.setTextSize(12);
        // 设置y轴数据偏移量
        //yAxis.setXOffset(16);
        yAxis.setYOffset(-3);
        //  yAxis.setAxisMinimum(0);


        Matrix matrix = new Matrix();
        // x轴缩放1.5倍
        // matrix.postScale(1.5f, 1f);
        // 在图表动画显示之前进行缩放
        //chart.getViewPortHandler().refresh(matrix, chart, false);
        // x轴执行动画
        // chart.animateX(1000);
        chart.invalidate();
        return chart;
    }

    public static void setBarChartData(BarChart chart, List<BarEntry> values) {
        BarDataSet barDataSet;

        if (chart.getData() != null && chart.getData().getDataSetCount() > 0) {
            barDataSet = (BarDataSet) chart.getData().getDataSetByIndex(0);
            barDataSet.setValues(values);
            //chart.getAxisLeft().setAxisMinimum( candleDataSet.getYMin());
            // chart.setVisibleXRange(0, 20);
            // chart.getViewPortHandler().setZoom(values.size()/40,1);
//            if (values.size() <= 30) {
//                chart.getData().setBarWidth(0.85f * values.size() / 30);
//                //chart.invalidate();
//            } else {
//                Matrix matrix = new Matrix();
//                matrix.postScale(values.size() / 30, 1f);
//                chart.getViewPortHandler().refresh(matrix, chart, false);
//            }
            //  Matrix matrix = new Matrix();
            //matrix.postScale(values.size() / 40, 1f);
            // chart.getViewPortHandler().refresh(matrix, chart, false);
            chart.getData().notifyDataChanged();
            chart.notifyDataSetChanged();
        } else {
            barDataSet = new BarDataSet(values, "");
            barDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);
            // 不显示坐标点的数据
            barDataSet.setDrawValues(false);
            // 不显示定位线
            barDataSet.setHighlightEnabled(true);
            //  chart.getAxisLeft().setAxisMinimum( candleDataSet.getYMin());
            BarData data = new BarData(barDataSet);
            chart.setData(data);
            if (values.size() <= 30) {
                data.setBarWidth(0.85f * values.size() / 30);
                chart.invalidate();
            } else {
                Matrix matrix = new Matrix();
                matrix.postScale(values.size() / 30, 1f);
                chart.getViewPortHandler().refresh(matrix, chart, true);
            }
            chart.moveViewToX(values.size() - 1);
//            if (values.size()<20){
//                data.setBarWidth();
//            }

            //chart.invalidate();
            //chart.setVisibleXRange(0, 20);
            // Matrix matrix = new Matrix();
            // matrix.postScale(values.size() / 40, 1f);
            // chart.getViewPortHandler().refresh(matrix, chart, true);
        }
        List<Integer> colors = new ArrayList<>();
        for (BarEntry barEntry : values) {
            Kline.DataBean dataBean = (Kline.DataBean) barEntry.getData();
            if (dataBean.getOpen() - dataBean.getClose() >=0) {
                colors.add(Color.parseColor("#F95A54"));
            } else {
                colors.add(Color.parseColor("#09C173"));
            }
        }
        barDataSet.setColors(colors);
    }

    public static void notifyBarDataSetChanged(BarChart chart, List<BarEntry> values, final String type, final List<Long> timeList) {
        if (values.isEmpty()) {
            return;
        }
        chart.getXAxis().setLabelCount(5);
        chart.getXAxis().setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                String time = dfs.format(new Date((timeList.get((int) value) * 1000)));
                switch (type) {
                    case TYPE_MINUTE:
                        return time.substring(time.length() - 5);
                    case TYPE_15_MINUTE:
                    case TYPE_ONE_HOUR:
                    case TYPE_FOUR_HOUR:
                        return time.substring(time.length() - 11);
                    case TYPE_DAY:
                        return time.substring(0, 10);
                }
                return "";

            }
        });
        //chart.invalidate();
        setBarChartData(chart, values);
    }


}
